#ifndef _app_can_H
#define _app_can_H

#include "main.h"	
#include "gd32f30x_can.h"
#include <stdint.h>
#include "smoke.h"
#include "sp_flash.h"

#define CAN_MSG_TX	CAN0MSG01
#define CAN_MSG_RX	CAN0MSG07
#define CAN_MSG_RX2	CAN0MSG02

/*
29位ID分配如下：
BIT0-9：10位长，表示从机地址（0表示公共从机地址，1~1023表示单一从机地址）。
BIT10-15：6位长，表示主机地址（0表示公共主机地址，1~63表示单一主机地址）。
BIT16-21：6位长，表示子包索引。当一个数据包长度超过8字节时，使用包索引，将长包分割为多个单一的子数据包进行发送。数据包最长不超过512字节 ，子包索引0表示第1个子数据包，63表示最后一个子数据包。例：
	1. 一个数据包有20个字节长，则第1个包的包索引为0，第2个包的包索引为1，第3个包为最后一个包，包索引为63。
	2. 一个数据包有6个字节长，则只有一个子包，包索引为63。
BIT22-27：6位长，表示命令类型，可表示64种命令。
BIT28：	1位长，表示包类型（0表示控制命令包，1表示状态数据包）
*/
#define EX_ID(a,b,c,d,e)	(((a&0x00000001)<<28)|((b&0X0000003F)<<22)|((c&0X0000003F)<<16)|((d&0X0000003F)<<10)|((e&0X000003FF)<<0))
#define	ID_SLAVE_ADDR(x)	((x>>0)&0X000003FF)
#define ID_HOST_ADDR(x)		((x>>10)&0X0000003F)
#define ID_PACK_IDX(x)		((x>>16)&0X0000003F)
#define ID_CMD_TYPE(x)		((x>>22)&0X0000003F)
#define ID_PACK_TYPE(x)		((x>>28)&0X00000001)

#define PACK_DOWN		(0)//主机下发控制命令包
#define PACK_UP			(1)//从机上传状态数据包

#define CMD_SYS_STATE	(0x00)//系统状态
#define CMD_APP_UPDATE	(0x01)//程序更新包
#define CMD_SLAVE_ID	(0x02)//ID编号和从机地址，从机上电或收到从机注册系统状态指令时，会向总线主动发送这个数据包。
#define CMD_SOFT_VER	(0x03)//软件版本（4字节）+节点类型（1字节）
#define CMD_GET_DATA	(0x10)//报警复位/故障复位/发送当前状态/发送原始值 等
#define CMD_RAW_DATA	(0x11)//由从机传感器发出的状态数据，表示4个传感器通道的原始取样数据。
#define CMD_CUR_DATA	(0x12)//由从机传感器发出的状态数据，表示4个传感器通道的当前数据。
#define CMD_CUR_STATE	(0x13)//由从机传感器发出的状态数据，表示4个传感器通道的当前状态及输出状态。
#define CMD_CONFIG		(0x14)//配置值
#define CMD_CALIBRATION	(0x15)//浓度校准值
#define CMD_FACTOR		(0x16)//浓度温度系数值

//增加命令
#define CMD_WR_ADDR		(0x30)//读写总线单个地址
#define CMD_CAL			(0x31)//标定
#define CMD_OUT			(0x32)//控制输出

#define CAN_RX_MAX	128
#define CAN_RX_OT	3
extern can_trasnmit_message_struct CAN_SendMsg;
extern can_receive_message_struct  CAN_RecvMsg,can_rx_msg[];
extern uint8_t can_rx_idx,can_rx_rd,can_tx_idx;
extern uint16_t f_can_reg,f_find_addr;

void can_app_init(void);
void task_can(void);
void can_rx_deal(void);

//测试数据
void can_up_test_data(void);

/*
江苏中远烟温复合探测器采用
<<(车型号)_(订单号)_通讯协议_烟雾探测系统SMDET分册.pdf>>协议
29位ID分配如下：
BIT28-26:3位,优先权P,最高000
BIT25	:1位,预留位R,置0
BIT24	:1位,数据页位DP,作为选择参数组描述的辅助页。所有参数组号应在第一页分派之前将第零页充满。
BIT23-16:8位,PDU格式PF,称为协议数据单元格式，它定义了协议数据格式，也是用于决定参数组号分配给数据场的场之一。
BIT15-8 :8位,PDU特性PS,根据协议数据单元格式定义，本场可能是目标地址或组扩展。如果 PF 场的值低于240，那么PS是目标地址。如果 PF 的值在 240 和 255 之间，那么 PS 包括一个组扩展值。
BIT7-0  :8位,PDU特性SA,作为发送此报文的源地址。
*/
#define EX_ID2(a,b,c,d,e,f)	\
(							\
((a&0x00000007)<<26)|		\
((b&0X00000001)<<25)|		\
((c&0X00000001)<<24)|		\
((d&0X000000FF)<<16)|		\
((e&0X000000FF)<<8)|		\
((f&0X000000FF)<<0))
#endif

